/* -*-jde-*- */
package app.conexion;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Conexion a la base de datos La clase que da el acceso y control a la capa de
 * control con la capa de almacenamiento
 *
 * @author Victor Miguel Peralta Santa Anna
 * @since Diciembre 2011
 * @version 0.1
 */
public class Conexion {

    /**
     * El nombre para la base de datos
     */
    private String base;
    /**
     * La ip para realizar la conexión
     */
    private String ip;
    /**
     * El usuario para la base de datos
     */
    private String usr;
    /**
     * La contraseña del usuario para la base de datos
     */
    private String pswd;
    /**
     * La conexión que preserva la clase a la base de datos
     */
    private Connection connection;

    /**
     * Nos dirije la conexión por default del sistema.
     */
    public Conexion() throws ConexionException {
        this.base = "mxcodex_bolsaciencias";
        this.ip = "localhost";
        this.usr = "mxcodex_bolsausr";
        this.pswd = "mxcodex_bolsausr";
        connect();
    }

    /**
     * Constructor para la conexión con los suficientes parámetros para
     * multiples conxiones
     *
     * @param base El nombre de la base de datos
     * @param ip La dirección ip a la cual debe conectarse
     * @param usr El nombre del usuario
     * @param pswd La contraseña para la base
     *
     * public Conexion(String base, String ip, String usr, String pswd) throws
     * ConexionException {
     *
     * this.base = base; this.ip = ip; this.usr = usr; this.pswd = pswd;
     *
     * Conexion.connection = connect(); }
     *
     */
    /**
     * Realizamos la conexión a la base de datos
     *
     * @return El objeto coneción
     * @throws ConexionException Se lanza si no se pudo conectar a la base de
     * datos
     */
    private void connect() throws ConexionException {
        try {

            String uri = "jdbc:postgresql://" + ip + "/" + base;
            Class.forName("org.postgresql.Driver");
            Connection con = DriverManager.getConnection(uri, usr, pswd);

            this.connection = con;

        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
            throw new ConexionException("Error al conectarse a la base de datos.");
        } catch (SQLException ex) {
            System.err.println(ex);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
            throw new ConexionException("Error al conectarse a la base de datos.");
        }
    }

    /**
     * Realizamos una consulta a la base de datos.
     *
     * @param connection La conexion a la base de datos con la que se ejecuta la
     * consulta
     * @param query La consulta a ejecutarse
     * @return El conjunto de resultados que se espera obtener de la consulta
     * @throws ConexionException Un error de la consulta
     */
    public ResultSet exec(String query) throws ConexionException {
        try {
            System.out.println(query);

            Statement statement = connection.createStatement();
            ResultSet resultset = statement.executeQuery(query);

            return resultset;
        } catch (SQLException sqle) {
            System.err.println(sqle);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, sqle);
            throw new ConexionException("Error al ejecutar la consulta a la base de datos.");
        }
    }

    /**
     * Cierra la conexion a la base de datos que preserva la clase
     */
    public void close() throws ConexionException {
        try {
            if (!connection.isClosed()) {
                connection.close();
            }
            //} catch( ){

        } catch (SQLException ex) {
            System.err.println(ex);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
            throw new ConexionException("No se puede cerrar la conexión a la base de datos.");
        }
    }

    /**
     * Conexiones de prueba a la base de datos
     *
     * @param args
     * @throws ConexionException
     * @throws SQLException
     */
    public static void main(String args[]) throws ConexionException, SQLException {
        Conexion c = new Conexion();
        ResultSet r = c.exec("Select * from usuarios;");

        while (r.next()) {
            System.out.println(
                    r.getInt("nidusuario")
                    + r.getString("susuario")
                    + r.getString("scontrasena")
                    + r.getBoolean("bactivado")
                    + r.getString("ctipousuario"));
        }

        c.close();

        System.out.println("cosa");
    }
}
